package cn.xiaoyu.su.manager.impl;

import cn.xiaoyu.su.manager.ProductOrderManager;
import cn.xiaoyu.su.mapper.ProductOrderMapper;
import cn.xiaoyu.su.model.ProductOrderDO;
import cn.xiaoyu.su.vo.ProductOrderVO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

@Component
public class ProductOrderManagerImpl implements ProductOrderManager {

    @Autowired
    private ProductOrderMapper productOrderMapper;

    /**
     * 新增
     * @param productOrderDO
     * @return
     */
    @Override
    public int add(ProductOrderDO productOrderDO) {
        return productOrderMapper.insert(productOrderDO);
    }

    /**
     * 通过订单号和账号查询
     * @param outTradeNo
     * @param accountNo
     * @return
     */
    @Override
    public ProductOrderDO findByOutTradeNoAndAccountNo(String outTradeNo, Long accountNo) {
        return productOrderMapper.selectOne(new QueryWrapper<ProductOrderDO>().eq("out_trade_no",outTradeNo)
                .eq("account_no",accountNo).eq("del",0));
    }

    /**
     * 更新订单状态
     * @param outTradeNo
     * @param accountNo
     * @param newState
     * @param oldState
     * @return
     */
    @Override
    public int updateOrderPayState(String outTradeNo, Long accountNo, String newState, String oldState) {
        return productOrderMapper.update(null,new UpdateWrapper<ProductOrderDO>().eq("out_trade_no",outTradeNo)
                .eq("account_no",accountNo)
                .eq("state",oldState)

                .set("state",newState));
    }

    /**
     * 分页查看订单状态
     * @param page
     * @param size
     * @param accountNo
     * @param state
     * @return
     */
    @Override
    public Map<String, Object> page(int page, int size, Long accountNo, String state) {

        IPage<ProductOrderDO> pageInfo = new Page<>(page,size);

        IPage<ProductOrderDO> productOrderDOIPage;

        if (StringUtils.isNotBlank(state)) {
            productOrderDOIPage = productOrderMapper.selectPage(pageInfo,
                    new QueryWrapper<ProductOrderDO>().eq("account_no",accountNo)
                            .eq("state",state).eq("del",0));
        } else {
            //如果state传空，查询全部
            productOrderDOIPage = productOrderMapper.selectPage(pageInfo,
                    new QueryWrapper<ProductOrderDO>().eq("account_no",accountNo).eq("del",0));
        }



        Map<String,Object> pageMap = new HashMap<>(3);
        pageMap.put("total_page",productOrderDOIPage.getPages());
        pageMap.put("total_record",productOrderDOIPage.getTotal());
        pageMap.put("current_data",productOrderDOIPage.getRecords().stream().map(obj -> beanProcess(obj)).collect(Collectors.toList()));

        return pageMap;
    }

    /**
     * 删除
     * @param productOrderId
     * @param accountNo
     * @return
     */
    @Override
    public int del(Long productOrderId, Long accountNo) {
        return productOrderMapper.update(null,new UpdateWrapper<ProductOrderDO>()
                .eq("id",productOrderId)
                .eq("account_no",accountNo)
                .eq("del",0)

                .set("del",1));
    }

    private ProductOrderVO beanProcess(ProductOrderDO productOrderDO) {
        ProductOrderVO productOrderVO = new ProductOrderVO();
        BeanUtils.copyProperties(productOrderDO,productOrderVO);
        return productOrderVO;
    }
}
